package com.example.springpostbody.core.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.util.ContentCachingRequestWrapper;

import java.io.IOException;
import java.io.PrintWriter;

// 类似控制器
//@WebServlet("/upload") // doPost自定义一个 Servlet 用于处理文件上传，可以处理大文件的分块上传，支持异步处理。
//@WebServlet("/events") // doGet 使用 Servlet 来处理 WebSocket 连接或 Server-Sent Events (SSE)，实现实时数据推送。
public class RegisterBeanServlet extends HttpServlet {

    /*@Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        super.service(req, res);
    }*/

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.service(req, resp);
        System.out.println("RegisterBeanServlet --> service方法");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        System.out.println("RegisterBeanServlet --> Get方法");
        String name = req.getParameter("name");
        if("".equals(name)){
            PrintWriter writer = resp.getWriter();
            writer.write("[RegisterBeanServlet] welcome " + name);
            writer.flush();
            writer.close();
        }
        // 请求转发（Request Forward）：请求转发是将请求从一个 Servlet 或 JSP 页面传递到另一个 Servlet
        // 或 JSP 页面的内部服务器行为。在请求转发中，地址栏中的 URL 不会发生变化，因为这是一个服务器内部的操作。
        // 请求转发会保留原始请求的所有信息，包括属性和参数。

        //请求转发的主要优点是它在服务器内部处理，因此效率更高。此外，由于请求信息保留完整，
        // 这使得在多个组件之间共享数据变得容易。
        req.getRequestDispatcher("/index.jsp").forward(req, resp);

        // 重定向（Redirection）：重定向是一种客户端-服务器行为，其中服务器通知客户端（浏览器）
        // 转到另一个 URL。这会导致浏览器向
        // 新 URL 发起新的请求。因此，重定向会导致地址栏中的 URL 发生变化。

        //与请求转发相比，重定向在网络上有更多的开销，因为涉及到两次请求。然而，在某些情况下，
        // 重定向可能是更合适的选择，例如在处理表单提交后，以避免用户刷新页面导致重复提交。
        resp.sendRedirect("/index.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
        System.out.println("RegisterBeanServlet --> Post方法");
        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(req);
        // 读取请求体
        String requestBody = new String(wrappedRequest.getContentAsByteArray());
        System.out.println("RegisterBeanServlet --> doPost 的 requestBody= "+requestBody);
        super.doPost(req, resp);
    }
}
